package com.zhibang.config;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.crazycake.shiro.RedisCacheManager;
import org.crazycake.shiro.RedisManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * shiro框架核心配置类
 **/
@Configuration
public class ShiroConfig {

    /**
     * shiro  WEB环境安全管理器  [必须]
     */
    @Bean
    public DefaultWebSecurityManager dwsm(){
        DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
        // 设置会话管理器
        dwsm.setSessionManager(new MySessionManager());
        // 设置域  (认证与授权 需要查询的dao类)
        dwsm.setRealm(realm());
        return dwsm;
    }

    @Bean
    public MysqlRealm realm(){
        MysqlRealm realm = new MysqlRealm();
        // 配置加密
        HashedCredentialsMatcher hcm = new HashedCredentialsMatcher();
        hcm.setHashAlgorithmName("SHA-256"); // 加密名称
        hcm.setHashIterations(100); // 加密次数
        realm.setCredentialsMatcher(hcm);
        // 设置权限缓存管理器
        RedisCacheManager cm = new RedisCacheManager();
        cm.setRedisManager(new RedisManager());
        cm.setKeyPrefix("shiro:"); // 存储前缀
        realm.setCacheManager(cm);
        return realm;
    }

    /**
     * shiro核心过滤器配置 [必须]
     * 组件名必须是shiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        // 设置安全管理器对象
        bean.setSecurityManager(dwsm());

        /*配置全局过滤*/
        /**
         * anon 可以匿名访问(不需要登录)
         * user 需要登录(包含记住我访问 Cookie访问)
         * authc 需要登录(不包含记住我 必须账户密码进入) 支付场景
         * roles 需要具有指定角色可以访问(多个角色需要同时满足)
         * perms 需要具有指定权限可以访问(多个权限需要同时满足)
         * logout 注销
         */
        Map<String,String> map = new LinkedHashMap<>();
//        map.put("/stu/list","anon");
//        map.put("/stu/**","user,myroles[经理,组长]");
        bean.setFilterChainDefinitionMap(map);

        return bean;
    }
}
